home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Libraries / Framework / Sources / UBehavior.cp < prev    next >
Encoding:
Text File  |  1996-04-03  |  17.2 KB  |  573 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UBehavior.cp
  3. // Copyright © 1991-96 by Apple Computer, Inc. All rights reserved.
  4. //----------------------------------------------------------------------------------------
  5.  
  6. #ifndef __UBEHAVIOR__
  7. #include "UBehavior.h"
  8. #endif
  9.  
  10. // MacApp
  11.  
  12. #ifndef __UCOREGLOBALS__
  13. #include "UCoreGlobals.h"
  14. #endif
  15.  
  16. #ifndef __UOBJECT__
  17. #include "UObject.h"
  18. #endif
  19.  
  20. #ifndef __USTREAM__
  21. #include "UStream.h"
  22. #endif
  23.  
  24.  
  25. //========================================================================================
  26. // CLASS TBehavior
  27. //========================================================================================
  28.  
  29. #undef Inherited
  30. #define Inherited TObject
  31.  
  32. #pragma segment MAOpen
  33. MA_DEFINE_CLASS_M1(TBehavior,
  34.                    Inherited);
  35.  
  36. //----------------------------------------------------------------------------------------
  37. // TBehavior constructor
  38. //----------------------------------------------------------------------------------------
  39. #pragma segment MAOpen
  40.  
  41. TBehavior::TBehavior() :
  42.     fOwner(NULL),
  43.     fNextBehavior(NULL),
  44.     fPreviousBehavior(NULL),
  45.     fIdentifier(kNoIdentifier),
  46.     fIdleFreq(kMaxIdleTime),
  47.     // Assume it never wants idle time 
  48.     fLastIdle(0),
  49.     fEnabled(TRUE),
  50.     fIsOwnerSelected(FALSE)
  51. {
  52. }
  53. // TBehavior::TBehavior
  54.  
  55. //----------------------------------------------------------------------------------------
  56. // TBehavior::IBehavior:
  57. //----------------------------------------------------------------------------------------
  58. #pragma segment MAOpen
  59.  
  60. void TBehavior::IBehavior(IDType itsIdentifier)
  61. {
  62.     IObject();
  63.  
  64.     fIdentifier = itsIdentifier;
  65. }
  66.  
  67. //----------------------------------------------------------------------------------------
  68. // TBehavior::Clone:
  69. //----------------------------------------------------------------------------------------
  70. #pragma segment MABehaviorNonRes
  71.  
  72. TObject* TBehavior::Clone()                        // Override 
  73. {
  74.     TBehavior * aClonedBehavior = (TBehavior *)(Inherited::Clone());
  75.  
  76.     aClonedBehavior->fNextBehavior = NULL;
  77.     aClonedBehavior->fOwner = NULL;
  78.     aClonedBehavior->fPreviousBehavior = NULL;
  79.  
  80.     return aClonedBehavior;
  81. }
  82.  
  83. //----------------------------------------------------------------------------------------
  84. // TBehavior::Free:
  85. //----------------------------------------------------------------------------------------
  86. #pragma segment MAClose
  87.  
  88. TBehavior::~TBehavior()
  89. {
  90.     fNextBehavior = (TBehavior *)FreeIfObject(fNextBehavior);
  91. }
  92.  
  93. //----------------------------------------------------------------------------------------
  94. // TBehavior::ReadFrom:
  95. //----------------------------------------------------------------------------------------
  96. #pragma segment MAReadResource
  97.  
  98. void TBehavior::ReadFrom(TStream* aStream)        // Override 
  99. {
  100.     Inherited::ReadFrom(aStream);
  101.  
  102.     fIdentifier = aStream->ReadIDType();
  103.     fEnabled = aStream->ReadBoolean();
  104.     fIdleFreq = aStream->ReadLong();
  105. }
  106.  
  107. //----------------------------------------------------------------------------------------
  108. // TBehavior::WriteTo:
  109. //----------------------------------------------------------------------------------------
  110. #pragma segment MAWriteResource
  111.  
  112. void TBehavior::WriteTo(TStream* aStream)        // Override 
  113. {
  114.     Inherited::WriteTo(aStream);
  115.  
  116.     aStream->WriteIDType(fIdentifier);
  117.     aStream->WriteBoolean(fEnabled);
  118.     aStream->WriteLong(fIdleFreq);
  119. }
  120.  
  121. //----------------------------------------------------------------------------------------
  122. // TBehavior::AppendBehavior:
  123. //----------------------------------------------------------------------------------------
  124. #pragma segment MAOpen
  125.  
  126. void TBehavior::AppendBehavior(TBehavior* aBehavior)
  127. {
  128.     if (aBehavior)
  129.     {
  130.         if (fNextBehavior)
  131.             fNextBehavior->AppendBehavior(aBehavior);
  132.         else
  133.         {
  134.             SetNextBehavior(aBehavior);
  135.             aBehavior->SetPreviousBehavior(this);
  136.         }
  137.     }
  138. }
  139.  
  140. //----------------------------------------------------------------------------------------
  141. // TBehavior::SetOwner:
  142. //----------------------------------------------------------------------------------------
  143. #pragma segment MAOpen
  144.  
  145. void TBehavior::SetOwner(TEventHandler* itsOwner)
  146. {
  147.     fOwner = itsOwner;
  148. }
  149.  
  150. //----------------------------------------------------------------------------------------
  151. // TBehavior::SelectOwner:
  152. //----------------------------------------------------------------------------------------
  153. #pragma segment MABehaviorNonRes
  154.  
  155. void TBehavior::SelectOwner(Boolean select)
  156. {
  157.     fIsOwnerSelected = select;
  158. }
  159.  
  160. //----------------------------------------------------------------------------------------
  161. // TBehavior::SetEnabled:
  162. //----------------------------------------------------------------------------------------
  163. #pragma segment MABehaviorRes
  164.  
  165. void TBehavior::SetEnabled(Boolean enabled)
  166. {
  167.     fEnabled = enabled;
  168. }
  169.  
  170. //----------------------------------------------------------------------------------------
  171. // TBehavior::GetNextEnabledBehavior:
  172. //----------------------------------------------------------------------------------------
  173. #pragma segment MABehaviorRes
  174.  
  175. TBehavior* TBehavior::GetNextEnabledBehavior() const
  176. {
  177.     return fNextBehavior ? (fNextBehavior->IsEnabled() ? fNextBehavior : fNextBehavior->GetNextEnabledBehavior()) : NULL;
  178. }
  179.  
  180. //----------------------------------------------------------------------------------------
  181. // TBehavior::InsertBefore:
  182. //----------------------------------------------------------------------------------------
  183. #pragma segment MABehaviorNonRes
  184.  
  185. void TBehavior::InsertBefore(TBehavior* insertMe,
  186.                              TBehavior* before)
  187. {
  188.     if (insertMe)
  189.     {
  190.         // We are one that insertion is going to be before
  191.         if (this == before)
  192.         {
  193.             if (fPreviousBehavior)
  194.                 fPreviousBehavior->SetNextBehavior(insertMe);
  195.  
  196.             insertMe->SetPreviousBehavior(fPreviousBehavior);
  197.             insertMe->SetNextBehavior(this);
  198.  
  199.             SetPreviousBehavior(insertMe);
  200.         }
  201.         else if (fNextBehavior)                // Pass message on down chain
  202.             fNextBehavior->InsertBefore(insertMe, before);
  203.     }
  204. }
  205.  
  206. //----------------------------------------------------------------------------------------
  207. // TBehavior::InsertAfter:
  208. //----------------------------------------------------------------------------------------
  209. #pragma segment MABehaviorNonRes
  210.  
  211. void TBehavior::InsertAfter(TBehavior* insertMe,
  212.                             TBehavior* after)
  213. {
  214.     if (insertMe)
  215.     {
  216.         // We are one that insertion is going to be after
  217.         if (this == after)
  218.         {
  219.             TBehavior * nextBehavior = GetNextBehavior();
  220.  
  221.             insertMe->SetPreviousBehavior(this);
  222.             insertMe->SetNextBehavior(nextBehavior);
  223.  
  224.             if (nextBehavior)
  225.                 nextBehavior->SetPreviousBehavior(insertMe);
  226.  
  227.             SetNextBehavior(insertMe);
  228.         }
  229.         else if (fNextBehavior)                // Pass message on down chain
  230.             fNextBehavior->InsertAfter(insertMe, after);
  231.     }
  232. }
  233.  
  234. //----------------------------------------------------------------------------------------
  235. // TBehavior::RemoveBehavior:
  236. //----------------------------------------------------------------------------------------
  237. #pragma segment MABehaviorNonRes
  238.  
  239. void TBehavior::RemoveBehavior(TBehavior* removeMe)
  240. {
  241.     // We are the one being removed
  242.     if (this == removeMe)
  243.     {
  244.         TBehavior * itsNextBehavior = GetNextBehavior();
  245.  
  246.         if (fPreviousBehavior)
  247.             fPreviousBehavior->SetNextBehavior(itsNextBehavior);
  248.  
  249.         if (itsNextBehavior)
  250.             itsNextBehavior->SetPreviousBehavior(fPreviousBehavior);
  251.  
  252.         // remove it from the linked list
  253.         SetNextBehavior(NULL);
  254.         SetPreviousBehavior(NULL);
  255.         SetOwner(NULL);
  256.     }
  257.     else if (fNextBehavior)                     // Pass message on down chain as we aren't one to be removed
  258.             fNextBehavior->RemoveBehavior(removeMe);
  259. }
  260.  
  261. //----------------------------------------------------------------------------------------
  262. // TBehavior::DoCommandKeyEvent:
  263. //----------------------------------------------------------------------------------------
  264. #pragma segment MASelCommand
  265.  
  266. void TBehavior::DoCommandKeyEvent(TToolboxEvent* event)
  267. {
  268.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  269.  
  270.     if (nextBehavior)
  271.         nextBehavior->DoCommandKeyEvent(event);
  272.     else if (fOwner)
  273.         fOwner->DoCommandKeyEvent(event);
  274. }
  275.  
  276. //----------------------------------------------------------------------------------------
  277. // TBehavior::DoEvent:
  278. //----------------------------------------------------------------------------------------
  279. #pragma segment MABehaviorRes
  280.  
  281. void TBehavior::DoEvent(EventNumber eventNumber,
  282.                         TEventHandler* source,
  283.                         TEvent* event)
  284. {
  285.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  286.  
  287.     if (nextBehavior)
  288.         nextBehavior->DoEvent(eventNumber, source, event);
  289.     else if (fOwner)
  290.         fOwner->DoEvent(eventNumber, source, event);
  291. }
  292.  
  293. //----------------------------------------------------------------------------------------
  294. // TBehavior::DoKeyEvent:
  295. //----------------------------------------------------------------------------------------
  296. #pragma segment MASelCommand
  297.  
  298. void TBehavior::DoKeyEvent(TToolboxEvent* event)
  299. {
  300.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  301.  
  302.     if (nextBehavior)
  303.         nextBehavior->DoKeyEvent(event);
  304.     else if (fOwner)
  305.         fOwner->DoKeyEvent(event);
  306. }
  307.  
  308. //----------------------------------------------------------------------------------------
  309. // TBehavior::DoKeyUp:
  310. //----------------------------------------------------------------------------------------
  311. #pragma segment MASelCommand
  312.  
  313. void TBehavior::DoKeyUp(TToolboxEvent* event)
  314. {
  315.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  316.  
  317.     if (nextBehavior)
  318.         nextBehavior->DoKeyUp(event);
  319.     else if (fOwner)
  320.         fOwner->DoKeyUp(event);
  321. }
  322.  
  323. //----------------------------------------------------------------------------------------
  324. // TBehavior::DoMenuCommand:
  325. //----------------------------------------------------------------------------------------
  326. #pragma segment MASelCommand
  327.  
  328. void TBehavior::DoMenuCommand(CommandNumber aCommandNumber)
  329. {
  330.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  331.  
  332.     if (nextBehavior)
  333.         nextBehavior->DoMenuCommand(aCommandNumber);
  334.     else if (fOwner)
  335.         fOwner->DoMenuCommand(aCommandNumber);
  336. }
  337.  
  338. //----------------------------------------------------------------------------------------
  339. // TBehavior::DoScriptCommand:
  340. //----------------------------------------------------------------------------------------
  341. #pragma segment MASelCommand
  342.  
  343. Boolean TBehavior::DoScriptCommand(CommandNumber aCommandNumber,
  344.                                    TAppleEvent* message,
  345.                                    TAppleEvent* reply)
  346. {
  347.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  348.  
  349.     return nextBehavior ? nextBehavior->DoScriptCommand(aCommandNumber, message, reply) : FALSE;
  350. }
  351.  
  352. //----------------------------------------------------------------------------------------
  353. // TBehavior::DoSetupMenus:
  354. //----------------------------------------------------------------------------------------
  355. #pragma segment MAEvtHandlerRes
  356.  
  357. void TBehavior::DoSetupMenus()
  358. {
  359.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  360.  
  361.     if (nextBehavior)
  362.         nextBehavior->DoSetupMenus();
  363.     else if (fOwner)
  364.         fOwner->DoSetupMenus();
  365. }
  366.  
  367. //----------------------------------------------------------------------------------------
  368. // TBehavior::DoBehaviorUpdate:
  369. //----------------------------------------------------------------------------------------
  370. #pragma segment MAObjectRes
  371.  
  372. void TBehavior::DoBehaviorUpdate(ChangeID theChange,
  373.                                  TObject* changedObject,
  374.                                  TObject* changedBy,
  375.                                  TDependencySpace* dependencySpace)
  376. {
  377.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  378.  
  379.     if (nextBehavior)
  380.         nextBehavior->DoBehaviorUpdate(theChange, changedObject, changedBy, dependencySpace);
  381. }
  382.  
  383. //----------------------------------------------------------------------------------------
  384. // TBehavior::NextIdle:
  385. //----------------------------------------------------------------------------------------
  386. #pragma segment MAEvtHandlerRes
  387.  
  388. long TBehavior::NextIdle()
  389. {
  390.     long returnVal = kMaxIdleTime;
  391.  
  392.     if ((fIdleFreq != kMaxIdleTime) && IsEnabled())// Does it idle at all? 
  393.     {
  394.         if (fLastIdle == 0)                        // if never idled then it needs idling now 
  395.             returnVal = TickCount();
  396.         else
  397.             returnVal = fLastIdle + fIdleFreq;
  398.     }
  399.  
  400.     return returnVal;
  401. }
  402.  
  403. //----------------------------------------------------------------------------------------
  404. // TBehavior::HandleIdle:
  405. //----------------------------------------------------------------------------------------
  406. #pragma segment MAEvtHandlerRes
  407.  
  408. void TBehavior::HandleIdle(IdlePhase phase)
  409. {
  410.     TBehavior * nextBehavior = GetNextEnabledBehavior();// Do first, because 'this'
  411.     // may be freed by DoIdle
  412.  
  413.     if ((fIdleFreq != kMaxIdleTime) && IsEnabled())// Does it idle at all? 
  414.     {
  415.         // idleBegin and idleEnd don't respect fIdleFreq because they are
  416.         // notifications that the application is beginning/ending idle.
  417.         // idleContinues, however, are parceled out at the fIdleFreq.
  418.  
  419.         if ((phase != idleContinue) || (TickCount() - fLastIdle >= fIdleFreq))
  420.         {
  421.             // don't store the fLastIdle if I FREE'd myself or
  422.             // the idlePhase is not idleContinue
  423.             if (!(DoIdle(phase)) && (phase == idleContinue))
  424.                 fLastIdle = TickCount();
  425.         }
  426.     }
  427.  
  428.     if (nextBehavior)
  429.         nextBehavior->HandleIdle(phase);
  430. }
  431.  
  432. //----------------------------------------------------------------------------------------
  433. // TBehavior::DoIdle:
  434. //----------------------------------------------------------------------------------------
  435. #pragma segment MAEvtHandlerRes
  436.  
  437. Boolean TBehavior::DoIdle(IdlePhase)
  438. {
  439.     return FALSE;                                // Did not free myself 
  440. }
  441.  
  442. //----------------------------------------------------------------------------------------
  443. // TBehavior::SetIdleFreq:
  444. //----------------------------------------------------------------------------------------
  445. #pragma segment MANonRes
  446.  
  447. void TBehavior::SetIdleFreq(long newIdleFreq)
  448. {
  449.     fIdleFreq = newIdleFreq;
  450. }
  451.  
  452. //----------------------------------------------------------------------------------------
  453. // TBehavior::DoMouseCommand:
  454. //----------------------------------------------------------------------------------------
  455. #pragma segment MASelCommand
  456.  
  457. Boolean TBehavior::DoMouseCommand(VPoint& theMouse,
  458.                                   TToolboxEvent* event,
  459.                                   CPoint hysteresis)
  460. {
  461.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  462.  
  463.     return nextBehavior ? nextBehavior->DoMouseCommand(theMouse, event, hysteresis) : FALSE;
  464. }
  465.  
  466. //----------------------------------------------------------------------------------------
  467. // TBehavior::DoMouseUp:
  468. //----------------------------------------------------------------------------------------
  469. #pragma segment MASelCommand
  470.  
  471. Boolean TBehavior::DoMouseUp(VPoint& theMouse,
  472.                              TToolboxEvent* event,
  473.                              CPoint hysteresis)
  474. {
  475.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  476.  
  477.     return nextBehavior ? nextBehavior->DoMouseUp(theMouse, event, hysteresis) : FALSE;
  478. }
  479.  
  480. //----------------------------------------------------------------------------------------
  481. // TBehavior::Draw:
  482. //----------------------------------------------------------------------------------------
  483. #pragma segment MABehaviorRes
  484.  
  485. void TBehavior::Draw(const VRect& area)
  486. {
  487.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  488.  
  489.     if (nextBehavior)
  490.         nextBehavior->Draw(area);
  491. }
  492.  
  493. //----------------------------------------------------------------------------------------
  494. // TBehavior::DoSetCursor:
  495. //----------------------------------------------------------------------------------------
  496. #pragma segment MABehaviorRes
  497.  
  498. Boolean TBehavior::DoSetCursor(const VPoint& localPoint,
  499.                                RgnHandle cursorRegion)
  500. {
  501.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  502.  
  503.     return nextBehavior ? nextBehavior->DoSetCursor(localPoint, cursorRegion) : FALSE;
  504. }
  505.  
  506. //----------------------------------------------------------------------------------------
  507. // TBehavior::DoToolboxEvent:
  508. //----------------------------------------------------------------------------------------
  509. #pragma segment MABehaviorRes
  510.  
  511. Boolean TBehavior::DoToolboxEvent(TToolboxEvent* event)
  512. {
  513.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  514.  
  515.     return nextBehavior ? nextBehavior->DoToolboxEvent(event) : FALSE;
  516. }
  517.  
  518. //----------------------------------------------------------------------------------------
  519. // TBehavior::DoPostCreate:
  520. //----------------------------------------------------------------------------------------
  521. #pragma segment MAOpen
  522.  
  523. void TBehavior::DoPostCreate(TDocument* itsDocument)
  524. {
  525.     TBehavior * nextBehavior = GetNextEnabledBehavior();
  526.  
  527.     if (nextBehavior)
  528.         nextBehavior->DoPostCreate(itsDocument);
  529. }
  530.  
  531. //========================================================================================
  532. // CLASS CBehaviorIterator
  533. //========================================================================================
  534.  
  535. #undef Inherited
  536. #define Inherited CIterator
  537.  
  538. //----------------------------------------------------------------------------------------
  539. // CBehaviorIterator::Advance:
  540. //----------------------------------------------------------------------------------------
  541. #pragma segment MABehaviorRes
  542.  
  543. void CBehaviorIterator::Advance()
  544. {
  545.     fCurrentBehavior = fNextBehavior;
  546.     if (fCurrentBehavior)
  547.         fNextBehavior = fCurrentBehavior->GetNextBehavior();
  548. }
  549.  
  550. //----------------------------------------------------------------------------------------
  551. // CBehaviorIterator::CBehaviorIterator.
  552. //----------------------------------------------------------------------------------------
  553. #pragma segment MABehaviorRes
  554.  
  555. CBehaviorIterator::CBehaviorIterator(TEventHandler* itsEventHandler) :
  556.     fFirstBehavior(NULL),
  557.     fCurrentBehavior(NULL),
  558.     fNextBehavior(NULL)
  559. {
  560.     if (itsEventHandler)
  561.     {
  562.         fFirstBehavior = itsEventHandler->fBehavior;
  563.         fCurrentBehavior = fFirstBehavior;
  564.         if (fFirstBehavior)
  565.             fNextBehavior = fFirstBehavior->GetNextBehavior();
  566.     }
  567. }
  568.  
  569. //----------------------------------------------------------------------------------------
  570. // End of UBehavior.cp
  571.  
  572. #pragma segment Inline
  573.